package com.ruoyi.web.controller.system;


import com.ruoyi.accountant.domain.TransactionDetail;
import com.ruoyi.system.domain.TReason;
import com.ruoyi.system.domain.TST;
import com.ruoyi.system.domain.TTransactionDetail;
import com.ruoyi.system.service.ITReasonService;
import com.ruoyi.system.service.ITTransactionDetailService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/TST")
public class TSTController {

    @Resource
    private ITTransactionDetailService itTransactionDetailService;

    @Resource
    private ITReasonService itReasonService;

    @GetMapping("/tst")
    public List<TST> report(@RequestParam("ofCompany") Long ofCompany,@RequestParam("date") String date){
        List<TST> tstList=new ArrayList<>();

        //营业收入
        TST YYSR=TST(14L,ofCompany,date);
        tstList.add(YYSR);

        //营业成本
        TST YYCB=TST(29L,ofCompany,date);
        tstList.add(YYCB);

        //营业毛利（营业收入 - 营业成本）
        TST YYML=new TST();
        YYML.setId(6L);
        YYML.setName("营业毛利：(营业收入 － 营业成本)");
        YYML.setMonth1(YYSR.getMonth1().subtract(YYCB.getMonth1()));
        YYML.setMonth2(YYSR.getMonth2().subtract(YYCB.getMonth2()));
        YYML.setMonth3(YYSR.getMonth3().subtract(YYCB.getMonth3()));
        YYML.setMonth4(YYSR.getMonth4().subtract(YYCB.getMonth4()));
        YYML.setMonth5(YYSR.getMonth5().subtract(YYCB.getMonth5()));
        YYML.setMonth6(YYSR.getMonth6().subtract(YYCB.getMonth6()));
        YYML.setMonth7(YYSR.getMonth7().subtract(YYCB.getMonth7()));
        YYML.setMonth8(YYSR.getMonth8().subtract(YYCB.getMonth8()));
        YYML.setMonth9(YYSR.getMonth9().subtract(YYCB.getMonth9()));
        YYML.setMonth10(YYSR.getMonth10().subtract(YYCB.getMonth10()));
        YYML.setMonth11(YYSR.getMonth11().subtract(YYCB.getMonth11()));
        YYML.setMonth12(YYSR.getMonth12().subtract(YYCB.getMonth12()));
        tstList.add(YYML);


        //营业费用
        TST YYFY=TST(8L,ofCompany,date);
        tstList.add(YYFY);


        //营业损益：(营业毛利 － 营业费用)
        TST YYSY=new TST();
        YYSY.setId(7L);
        YYSY.setName("营业损益：(营业毛利 － 营业费用)");
        YYSY.setMonth1(YYML.getMonth1().subtract(YYFY.getMonth1()));
        YYSY.setMonth2(YYML.getMonth2().subtract(YYFY.getMonth2()));
        YYSY.setMonth3(YYML.getMonth3().subtract(YYFY.getMonth3()));
        YYSY.setMonth4(YYML.getMonth4().subtract(YYFY.getMonth4()));
        YYSY.setMonth5(YYML.getMonth5().subtract(YYFY.getMonth5()));
        YYSY.setMonth6(YYML.getMonth6().subtract(YYFY.getMonth6()));
        YYSY.setMonth7(YYML.getMonth7().subtract(YYFY.getMonth7()));
        YYSY.setMonth8(YYML.getMonth8().subtract(YYFY.getMonth8()));
        YYSY.setMonth9(YYML.getMonth9().subtract(YYFY.getMonth9()));
        YYSY.setMonth10(YYML.getMonth10().subtract(YYFY.getMonth10()));
        YYSY.setMonth11(YYML.getMonth11().subtract(YYFY.getMonth11()));
        YYSY.setMonth12(YYML.getMonth12().subtract(YYFY.getMonth12()));
        tstList.add(YYSY);

        //税前损益：(营业损益 + 营业外收益 － 营业外费损)
        TST SQSY=new TST();
        SQSY.setId(11L);
        SQSY.setName("税前损益：(营业损益 + 营业外收益 － 营业外费损)");

            //营业外收益
            TST YYWSY=TST(15L,ofCompany,date);
            //营业外成本
            TST YYWCB=TST(32L,ofCompany,date);
            //营业外毛利
            TST YYWML=new TST();
            YYWML.setMonth1(YYWSY.getMonth1().subtract(YYWCB.getMonth1()));
            YYWML.setMonth2(YYWSY.getMonth2().subtract(YYWCB.getMonth2()));
            YYWML.setMonth3(YYWSY.getMonth3().subtract(YYWCB.getMonth3()));
            YYWML.setMonth4(YYWSY.getMonth4().subtract(YYWCB.getMonth4()));
            YYWML.setMonth5(YYWSY.getMonth5().subtract(YYWCB.getMonth5()));
            YYWML.setMonth6(YYWSY.getMonth6().subtract(YYWCB.getMonth6()));
            YYWML.setMonth7(YYWSY.getMonth7().subtract(YYWCB.getMonth7()));
            YYWML.setMonth8(YYWSY.getMonth8().subtract(YYWCB.getMonth8()));
            YYWML.setMonth9(YYWSY.getMonth9().subtract(YYWCB.getMonth9()));
            YYWML.setMonth10(YYWSY.getMonth10().subtract(YYWCB.getMonth10()));
            YYWML.setMonth11(YYWSY.getMonth11().subtract(YYWCB.getMonth11()));
            YYWML.setMonth12(YYWSY.getMonth12().subtract(YYWCB.getMonth12()));
            //营业外费用
            TST YYWFY=TST(63L,ofCompany,date);
            //营业外费损益
            TST YYWFSY=new TST();
            YYWFSY.setMonth1(YYWML.getMonth1().subtract(YYWFY.getMonth1()));
            YYWFSY.setMonth2(YYWML.getMonth2().subtract(YYWFY.getMonth2()));
            YYWFSY.setMonth3(YYWML.getMonth3().subtract(YYWFY.getMonth3()));
            YYWFSY.setMonth4(YYWML.getMonth4().subtract(YYWFY.getMonth4()));
            YYWFSY.setMonth5(YYWML.getMonth5().subtract(YYWFY.getMonth5()));
            YYWFSY.setMonth6(YYWML.getMonth6().subtract(YYWFY.getMonth6()));
            YYWFSY.setMonth7(YYWML.getMonth7().subtract(YYWFY.getMonth7()));
            YYWFSY.setMonth8(YYWML.getMonth8().subtract(YYWFY.getMonth8()));
            YYWFSY.setMonth9(YYWML.getMonth9().subtract(YYWFY.getMonth9()));
            YYWFSY.setMonth10(YYWML.getMonth10().subtract(YYWFY.getMonth10()));
            YYWFSY.setMonth11(YYWML.getMonth11().subtract(YYWFY.getMonth11()));
            YYWFSY.setMonth12(YYWML.getMonth12().subtract(YYWFY.getMonth12()));
        SQSY.setMonth1(YYSY.getMonth1().add(YYWSY.getMonth1().subtract(YYWFSY.getMonth1())));
        SQSY.setMonth2(YYSY.getMonth2().add(YYWSY.getMonth2().subtract(YYWFSY.getMonth2())));
        SQSY.setMonth3(YYSY.getMonth3().add(YYWSY.getMonth3().subtract(YYWFSY.getMonth3())));
        SQSY.setMonth4(YYSY.getMonth4().add(YYWSY.getMonth4().subtract(YYWFSY.getMonth4())));
        SQSY.setMonth5(YYSY.getMonth5().add(YYWSY.getMonth5().subtract(YYWFSY.getMonth5())));
        SQSY.setMonth6(YYSY.getMonth6().add(YYWSY.getMonth6().subtract(YYWFSY.getMonth6())));
        SQSY.setMonth7(YYSY.getMonth7().add(YYWSY.getMonth7().subtract(YYWFSY.getMonth7())));
        SQSY.setMonth8(YYSY.getMonth8().add(YYWSY.getMonth8().subtract(YYWFSY.getMonth8())));
        SQSY.setMonth9(YYSY.getMonth9().add(YYWSY.getMonth9().subtract(YYWFSY.getMonth9())));
        SQSY.setMonth10(YYSY.getMonth10().add(YYWSY.getMonth10().subtract(YYWFSY.getMonth10())));
        SQSY.setMonth11(YYSY.getMonth11().add(YYWSY.getMonth11().subtract(YYWFSY.getMonth11())));
        SQSY.setMonth12(YYSY.getMonth12().add(YYWSY.getMonth12().subtract(YYWFSY.getMonth12())));


        tstList.add(SQSY);

        //税后损益：(税前损益 － 所得税费用)
        TST SHSY=new TST();
        SHSY.setId(12L);
        SHSY.setName("税后损益：(税前损益 － 所得税费用)");

            //所得税费用
            TST SDSFY=TST(24L,ofCompany,date);
        SHSY.setMonth1(SQSY.getMonth1().subtract(SDSFY.getMonth1()));
        SHSY.setMonth1(SQSY.getMonth2().subtract(SDSFY.getMonth2()));
        SHSY.setMonth1(SQSY.getMonth3().subtract(SDSFY.getMonth3()));
        SHSY.setMonth1(SQSY.getMonth4().subtract(SDSFY.getMonth4()));
        SHSY.setMonth1(SQSY.getMonth5().subtract(SDSFY.getMonth5()));
        SHSY.setMonth1(SQSY.getMonth6().subtract(SDSFY.getMonth6()));
        SHSY.setMonth1(SQSY.getMonth7().subtract(SDSFY.getMonth7()));
        SHSY.setMonth1(SQSY.getMonth8().subtract(SDSFY.getMonth8()));
        SHSY.setMonth1(SQSY.getMonth9().subtract(SDSFY.getMonth9()));
        SHSY.setMonth1(SQSY.getMonth10().subtract(SDSFY.getMonth10()));
        SHSY.setMonth1(SQSY.getMonth11().subtract(SDSFY.getMonth11()));
        SHSY.setMonth1(SQSY.getMonth12().subtract(SDSFY.getMonth12()));
        tstList.add(SHSY);

        return tstList;
    }

    public TST tst(Long ofCompany,String date,Long ofReason,String name,Long id){

        TST tst=new TST();
        tst.setId(id);
        tst.setName(name);

        TTransactionDetail transactionDetail=new TTransactionDetail();
        transactionDetail.setOfCompany(ofCompany);
        transactionDetail.setOfReason(ofReason);
        List<TTransactionDetail> tTransactionDetailList=itTransactionDetailService.selectTTransactionDetailList(transactionDetail);

        if(tTransactionDetailList !=null){
            for (TTransactionDetail i:tTransactionDetailList){
                LocalDate m1 = LocalDate.parse(i.getCreatetime(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
                if(Integer.valueOf(date)==m1.getYear()){
                    if(m1.getMonthValue()==1){
                        tst.setMonth1(tst.getMonth1().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==2){
                        tst.setMonth2(tst.getMonth2().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==3){
                        tst.setMonth3(tst.getMonth3().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==4){
                        tst.setMonth4(tst.getMonth4().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==5){
                        tst.setMonth5(tst.getMonth5().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==6){
                        tst.setMonth6(tst.getMonth6().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==7){
                        tst.setMonth7(tst.getMonth7().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==8){
                        tst.setMonth8(tst.getMonth8().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==9){
                        tst.setMonth9(tst.getMonth9().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==10){
                        tst.setMonth10(tst.getMonth10().add(i.getMoney()));
                    }
                    if(m1.getMonthValue()==11){
                        tst.setMonth11(tst.getMonth11().add(i.getMoney()));
                    }
                    if((m1.getMonthValue()+1)==12){
                        tst.setMonth12(tst.getMonth12().add(i.getMoney()));
                    }
                }
            }
          tst.setMoney(totalize(tst));
        }
        return tst;
    }

    public TST TST(Long ofReason,Long ofCompany,String date){
        TReason tReason=new TReason();
        tReason.setRid(ofReason);
        List<TReason> tReasonList=itReasonService.selectTReasonList(tReason);
        for(TReason tr:tReasonList){
            TST tstc=tst(ofCompany,date,tr.getRid(),tr.getRname(),tr.getRid());
            List<TST> tstList=new ArrayList<>();
            for(TReason r:tr.getParamst()){
                TST tstr=tst(ofCompany,date,r.getRid(),r.getRname(),r.getRid());
                List<TST> tst1List=new ArrayList<>();
                for(TReason r1:r.getParamst()){
                    TST tstr1=tst(ofCompany,date,r1.getRid(),r1.getRname(),r1.getRid());
                    tst1List.add(tstr1);
                }
                tstList.add(tstr);
                tstr.setChildren(tst1List);
                List<TST> tstrCh=tstr.getChildren();
                month(tstr,tstrCh);
                tstr.setMoney(totalize(tstr));
            }
            tstc.setChildren(tstList);
            List<TST> tstcCh=tstc.getChildren();
            month(tstc,tstcCh);
            tstc.setMoney(totalize(tstc));
            return tstc;
        }
        return null;
    }

    public BigDecimal totalize(TST tst){
         tst.setMoney(tst.getMonth1().add(tst.getMonth2().add(tst.getMonth3().add(tst.getMonth4().add(tst.getMonth5().add(tst.getMonth6().add(tst.getMonth7().add(tst.getMonth8().add(tst.getMonth9().add(tst.getMonth10().add(tst.getMonth11().add(tst.getMonth12()))))))))))));
         BigDecimal bigDecimal=tst.getMoney();
         return bigDecimal;
    }

    public void month(TST tst,List<TST> i){
        for(TST tstcChI:i){
            tst.setMonth1(tst.getMonth1().add(tstcChI.getMonth1()));
            tst.setMonth2(tst.getMonth2().add(tstcChI.getMonth2()));
            tst.setMonth3(tst.getMonth3().add(tstcChI.getMonth3()));
            tst.setMonth4(tst.getMonth4().add(tstcChI.getMonth4()));
            tst.setMonth5(tst.getMonth5().add(tstcChI.getMonth5()));
            tst.setMonth6(tst.getMonth6().add(tstcChI.getMonth6()));
            tst.setMonth7(tst.getMonth7().add(tstcChI.getMonth7()));
            tst.setMonth8(tst.getMonth8().add(tstcChI.getMonth8()));
            tst.setMonth9(tst.getMonth9().add(tstcChI.getMonth9()));
            tst.setMonth10(tst.getMonth10().add(tstcChI.getMonth10()));
            tst.setMonth11(tst.getMonth11().add(tstcChI.getMonth11()));
            tst.setMonth12(tst.getMonth12().add(tstcChI.getMonth12()));
        }
    }
}
